package com.wuwei.tran.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Pattern;

public class FileSearcher {

    // 递归搜索指定路径下符合条件的所有文件和文件夹
    public List<File> searchFiles(String directoryPath, String name) {
        List<File> result = new ArrayList<>();
        File dir = new File(directoryPath);
        String regex = ".*"+name+".*";

        if (dir.exists() && dir.isDirectory()) {
            // 递归查找所有文件和文件夹
            searchFilesRecursive(dir, regex, result);
        }

        // 排序结果：文件夹在前，按最后修改时间倒序排列
        Collections.sort(result, new FileComparator());

        return result;
    }

    // 递归遍历文件夹
    private void searchFilesRecursive(File dir, String regex, List<File> result) {
        // 使用正则表达式编译模式
        Pattern pattern = Pattern.compile(regex);

        // 获取当前目录下的所有文件和文件夹
        File[] files = dir.listFiles();
        if (files != null) {
            for (File file : files) {
                // 如果文件名匹配正则表达式，则添加到结果中
                if (pattern.matcher(file.getName()).find()) {
                    result.add(file);
                }
                // 如果是文件夹，则递归搜索其内容
                if (file.isDirectory()) {
                    searchFilesRecursive(file, regex, result);
                }
            }
        }
    }

    // 自定义排序Comparator
    static class FileComparator implements Comparator<File> {
        @Override
        public int compare(File f1, File f2) {
            // 1. 文件夹在前：文件夹的 isDirectory() 为 true
            if (f1.isDirectory() && !f2.isDirectory()) {
                return -1;
            }
            if (!f1.isDirectory() && f2.isDirectory()) {
                return 1;
            }

            // 2. 文件夹与文件、文件夹与文件夹、文件与文件之间按照最后修改时间倒序排序
            long lastModified1 = f1.lastModified();
            long lastModified2 = f2.lastModified();

            // 时间倒序：返回值为负数时f1排前面，正数时f2排前面
            return Long.compare(lastModified2, lastModified1);
        }
    }
}
